#include "dev_iic.h"
#include "drv_systick.h"
//SDA->PB7 SCL->PB6
void drv_iic_init(void)//将两个io口设为浮空
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,  ENABLE);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(  GPIOB,  & GPIO_InitStruct);

	
}
void drv_iic_in(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init( GPIOB, &GPIO_InitStruct);
}
void drv_iic_out(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOB, &GPIO_InitStruct);
}
void drv_iic_start(void)
{
	SCL_L;
	drv_iic_out();
	SDA_H;
	SCL_H;
	drv_systick_ms(5);
	SDA_L;
	drv_systick_ms(5);
	SCL_L;
}
void drv_iic_stop(void)
{
	SCL_L;
	drv_iic_out();
	SDA_L;
	SCL_H;
	drv_systick_ms(5);
	SDA_H;
	drv_systick_ms(5);
}
void drv_iic_sendACK(void)
{
	SCL_L;
	drv_iic_out();
	SDA_L;
	SCL_H;
	drv_systick_ms(5);
	SCL_L;
}
void drv_iic_sendNACK(void)
{
	SCL_L;
	drv_iic_out();
	SDA_H;
	SCL_H;
	drv_systick_ms(5);
	SDA_L;
}
void drv_iic_waitACK(void)
{
	uint16_t tim_out=0;
	SCL_L;
	drv_iic_in();
	 
	SCL_H;
	while(READ_SDA)
	{
		tim_out++;
		if(tim_out > 500)
		{
			drv_iic_stop();
			return NACK;
		}
	}
	SCL_L;
	return ACK;
}
void drv_iic_senddata(uint8_t data)
{
	uint8_t i=0;
	SCL_L;
	drv_iic_out();

	for(i=0;i<8;i++)
	{
		if(data&0x80)
		{
			SDA_H;
		}
		else
		{
			SDA_L;
		}
		SCL_H;
		drv_systick_us(1);
	}
}
uint8_t drv_iic_readdata(uint8_t flg_ack)
{
	uint8_t read_data =0 , i=0;
	SCL_L;
	drv_iic_in();
	for(i=0;i<8;i++)
	{
		read_data = read_data<<1;
		SCL_H;
		if(READ_SDA)
		{
			read_data|=0x01;
		}
		drv_systick_us(1);
		SCL_L;
		drv_systick_us(1);
	}
	if(flg_ack == ACK)
	{
		drv_iic_sendACK();
	}
	else
	{
		drv_iic_sendNACK();
	}
	SCL_L;
	return read_data;
}
